package br.com.droid;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import br.com.droid.model.AvaliacaoComentario;

public class BancoAvaliacaoComentario {
	
	private ArrayList<AvaliacaoComentario> listaAvaliacoes;

	private static BancoAvaliacaoComentario instance;

	public BancoAvaliacaoComentario() {
		listaAvaliacoes = new ArrayList<AvaliacaoComentario>();
	}

	public static BancoAvaliacaoComentario getBancoInstance() {
		if (instance == null)
			instance = new BancoAvaliacaoComentario();
		return instance;
	}

	public int quantidadeAvaliacoes(long id_comentario) {
		String teste = "SELECT COUNT(*) as Total from AvaliacaoComentario where id_comentario = +"
				+ id_comentario + " and flag_avaliacao=1;";
		int total = 0;

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				ResultSet rs = stm.executeQuery(teste);
				total = rs.getInt("Total");
				ConexaoMySQL.FecharConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return total;
	}

	public String inserirAvaliacao(AvaliacaoComentario avaliacao) {

		String teste = "INSERT into AvaliacaoComentario(id_usuario, id_comentario, flag_avaliacao) values ("
				+ avaliacao.getId_usuario()
				+ ", "
				+ avaliacao.getId_comentario()
				+ ", "
				+ 1
				+ ");";

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				stm.executeUpdate(teste);
				ConexaoMySQL.FecharConexao();
				return "Avaliacao inserido no banco com sucesso!";
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return "Erro ao inserir a avaliacao!";
	}

	public String atualizarAvaliacao(AvaliacaoComentario avaliacao) {
		String teste;

		teste = "UPDATE AvaliacaoComentario set flag_avaliacao = "
				+ avaliacao.getFlag_avaliacao() + " where id_usuario = "
				+ avaliacao.getId_usuario() + " and id_comentario = "
				+ avaliacao.getId_comentario() + ";";

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				stm.executeUpdate(teste);
				ConexaoMySQL.FecharConexao();
				return "Comentario deletado no banco com sucesso!";
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return "Erro ao atualizar a Avaliacao!";
	}

	public int quantidade_avaliacoes_comentario(long idComentario) {
		String teste;
		int quantidade = 0;

		teste = "SELECT COUNT(*) as quantidade FROM AvaliacaoComentario where id_comentario = "
				+ idComentario + ";";

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				ResultSet rs = stm.executeQuery(teste);
				while (rs.next()) {
					quantidade = rs.getInt("quantidade");
				}
				ConexaoMySQL.FecharConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return quantidade;
	}
	
	public int quantidade_avaliacoes_positivas_ou_negativas(long idComentario, int flag_avaliacao) {
		String teste;
		int quantidade = 0;

		teste = "SELECT COUNT(*) as quantidade FROM AvaliacaoComentario where id_comentario = "
				+ idComentario + " and flag_avaliacao = "+flag_avaliacao+";";

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				ResultSet rs = stm.executeQuery(teste);
				while (rs.next()) {
					quantidade = rs.getInt("quantidade");
				}
				ConexaoMySQL.FecharConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return quantidade;
	}

	public ArrayList<AvaliacaoComentario> listarAvaliacoes(long idCentro) {

		String teste = "SELECT a.* from AvaliacaoComentario a, comentario c, unidade u " +
							"where (a.id_comentario = c.id) and (c.id_unidade = u.id) and " +
							"(u.id_centro = "+ idCentro + ") " +
									"UNION " +
						"SELECT a.* from AvaliacaoComentario a, comentario c, lugar l " +
							"where (a.id_comentario = c.id) and (c.id_lugar = l.id) and " +
							"(l.id_centro = "+ idCentro + ") ORDER BY lastmodified DESC limit 100; ";
		
		listaAvaliacoes.clear();

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				ResultSet rs = stm.executeQuery(teste);
				while (rs.next()) {
					AvaliacaoComentario avaliacao = new AvaliacaoComentario();
					avaliacao.setId_usuario(rs.getLong("id_usuario"));
					avaliacao.setId_comentario(rs.getLong("id_comentario"));
					avaliacao.setFlag_avaliacao(rs.getInt("flag_avaliacao"));
					avaliacao.setLastmodified(rs.getString("lastmodified"));
					listaAvaliacoes.add(avaliacao);
				}
				ConexaoMySQL.FecharConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return listaAvaliacoes;
	}
	
	public ArrayList<AvaliacaoComentario> listarAvaliacoesNaoSincronizados(String data, long idCentro) {

		String teste = "SELECT a.* from AvaliacaoComentario a, comentario c, unidade u " +
				"where (a.id_comentario = c.id) and (c.id_unidade = u.id) and " +
				"(u.id_centro = "+ idCentro + ") and (a.lastmodified > '" + data + "')" +
						"UNION " +
			"SELECT a.* from AvaliacaoComentario a, comentario c, lugar l " +
				"where (a.id_comentario = c.id) and (c.id_lugar = l.id) and " +
				"(l.id_centro = "+ idCentro + ") and (a.lastmodified > '" + data + "') ORDER BY lastmodified; ";
		
		
		listaAvaliacoes.clear();

		if (ConexaoMySQL.getConexaoMySQL() != null) {
			Statement stm;
			try {
				stm = ConexaoMySQL.getConexaoMySQL().createStatement();
				ResultSet rs = stm.executeQuery(teste);
				while (rs.next()) {
					AvaliacaoComentario avaliacao = new AvaliacaoComentario();
					avaliacao.setId_usuario(rs.getLong("id_usuario"));
					avaliacao.setId_comentario(rs.getLong("id_comentario"));
					avaliacao.setFlag_avaliacao(rs.getInt("flag_avaliacao"));
					avaliacao.setLastmodified(rs.getString("lastmodified"));
					listaAvaliacoes.add(avaliacao);
				}
				ConexaoMySQL.FecharConexao();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return listaAvaliacoes;
	}

}
